package genetica;

import genetica.algoritmoSeleccion.AlgoritmoSeleccion;
import genetica.cromosomas.Cromosoma;
import genetica.cromosomas.factorias.FactoriaCromosomas;
import genetica.cruce.AlgoritmoCruce;
import genetica.excepciones.ExcepcionGenetica;
import genetica.mutacion.AlgoritmoMutacion;

public class Start {

	private static double[] mejorAbsoluto;
	private static double[] mejorGeneracion;
	private static double[] mediaGeneracion;
	private static boolean debug = true;

	public static void startAlgoritm(int poblacion, int generaciones,
			Double probCruce, Double probMutacion,
			FactoriaCromosomas<Cromosoma> factoria, AlgoritmoSeleccion as,
			AlgoritmoMutacion am, AlgoritmoCruce ac, Integer elitismo)
			{
		AlgoritmoGenetico ag;
		ag = new AlgoritmoGenetico(poblacion, generaciones, probCruce,
				probMutacion, factoria, as, am, ac, elitismo);

		mejorAbsoluto = new double[generaciones];
		mejorGeneracion = new double[generaciones];
		mediaGeneracion = new double[generaciones];
		ag.evaluarPoblacion();
		while (!ag.terminado()) {
			ag.seleccion();
			ag.cruce();
			ag.mutacion();
			// hay que calcular los fenotipos desppues de esto
			ag.evaluarPoblacion();
			if (Start.debug)
				System.out.println("Generación:" + print(ag.generacion, 3)
						+ ", el mejor::" + (ag.getElMejor()));
			mejorGeneracion[ag.generacion] = ag.getElMejorGeneracion()
					.getAptitud();
			mejorAbsoluto[ag.generacion] = ag.getElMejor().getAptitud();

			mediaGeneracion[ag.generacion] = ag.getMedia();
			ag.aumentaGeneracion();

		}
		// devuelve pob[pos_mejor]

		System.out.println("Generación:" + print(ag.generacion++, 3)
				+ ", el mejor::" + ag.getElMejor());

	}

	public static String print(int value, int positions) {
		String cadena = "";
		if (value == 0) {
			for (int i = 0; i < positions; i++, cadena += "0")
				;
			return cadena;
		}
		int numero = 1;
		for (int i = 0; i < positions; i++, numero *= 10)
			;
		int posicionesanadidas = value;
		while ((numero) > (posicionesanadidas *= 10))
			cadena += "0";
		cadena += value;
		return cadena;
	}

	public static double[] getMejorAbsoluto() {
		return mejorAbsoluto;
	}

	public static double[] getMejorGeneracion() {
		return mejorGeneracion;
	}

	public static double[] getMediaGeneracion() {
		return mediaGeneracion;
	}
}
